#include <stdio.h>
#include <stdlib.h>
#include "../lib/Lsimple.h"
#include "../lib/Colas.h"
#include "../lib/Pilas.h"
#include "../TIN/TIN.h"

#define _ESPACIO "@"
#define _EOL "|"
#define _SEP "#"

typedef struct user_t{
	int user_id;
	char* user_name;
	TListaSimple prioridades;
} user_t;

typedef struct project_t{
	int project_id;
	char* project_name;
	TListaSimple prioridades;
} project_t;

typedef struct{
	TListaSimple incidencias;
	TListaSimple proyectos;
	TListaSimple usuarios;
}TGI;


//void incidencia_usuario(TListaSimple* usuarios, int id, const prior_inci_t p2, TIN* tin);


//void incidencia_proyecto(TListaSimple* proyectos, int id, prior_inci_t p, TIN* tin);


/*PRE
 *tgi tiene suficiente memoria reservada para una estructura de tipo TGI.
 *Proyectos es la ruta al archivo de proyectos, alocada y terminada en \0.
 *Usuarios es la ruta al archivo de proyectos, alocada y terminada en \0.
 *POST
 *Si el archivo existe y está versionado, lo abre y devuelve 0. Si el archivo
 *existe y no está versionado, inicializa la funcionalidad de versionado y
 *devuelve 1. Si hubo algún error devuelve -1.
 */
int TGI_Crear ( TGI* tgi, const char* proyectos, const char* usuarios, const char* incidencias);


/*PRE tgi creado.
 *POST Si devuelve 0, gestor cerrado. Si devuelve -1 ocurrió algún error.
 */
int TGI_Cerrar( TGI* tgi);


/*PRE tgi creado.
 *POST
 *Devuelve el ID de la incidencia creada si no hubo error. Si devuelve -1 no
 *existe el ID del proyecto. Si devuelve -2 no existe el id del usuario. Si
 *devuelve -3 ocurrió otro error.
 */
int TGI_AgregarIncidencia ( TGI* tgi, tipo_inci_t inci_type, prior_inci_t inci_priority,int inci_user, int inci_assigned_user, char* inci_date_created, int inci_project_id, char*	inci_summary, char* inci_description);



/*PRE tgi creado. tin tiene memoria reservada para una estructura de tipo TIN.
 *POST
 *Si devuelve 0 devolvió en tin la incidencia. La memoria de los strings debe
 *ser liberada por el invocador. Si devuelve -1 no existe la incidencia inci. Si
 *devuelve -2 ocurrió otro error.
 */
int TGI_GetIncidencia( const TGI* tgi, int inci, TIN* tin);


/*PRE tgi creado. incidencias apunta a una cola creada y vacía para contener
 *objetos de tipo TIN.
 *POST
 *Si devuelve 0 devolvió en incidencias las incidencias del usuario. La
 *memoria de los strings debe ser liberada por el invocador. Si devuelve -1 no
 *existen incidencias para el usuario. Si devuelve -2 ocurrió otro error.
 */
int TGI_GetIncidenciasUsuario( const TGI* tgi, int usuario, TCola* incidencias);


/*PRE tgi creado. incidencias apunta a una cola creada y vacía para contener
 *objetos de tipo TIN.
 *POST
 *Si devuelve 0 devolvió en incidencias las incidencias del usuario. La
 *memoria de los strings debe ser liberada por el invocador. Si devuelve -1 no
 *existen incidencias para el usuario. Si devuelve -2 ocurrió otro error.
 */
int TGI_GetIncidenciasProyecto( const TGI* tgi, int proyecto, TListaSimple* incidencias);


int TGI_Borrar_Incidencia (TGI* tgi, int inci_id);


int TGI_Modificar_Incidencia (TGI* tgi, TIN* tin);


int Agregar_Usuario (TGI* tgi, const char* usuarios, const char* nombre);


int Agregar_Proyecto (TGI* tgi, const char* proyectos, const char* nombre);
